<?php
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;

if(!function_exists('success'))
{
  /**
   * 成功响应
   *
   * @param array $data 响应数据
   * @param string $message 响应消息
   * @param int $status 成功状态
   * @return JsonResponse
   */
  function success(mixed $data = [], string $message = '', int $status = 200) : JsonResponse
  {
    return response()->json([
      'status' => $status,
      'message' => $message ?: __('kernel.request_success'),
      'timestamp' => time(),
      'data' => $data,
    ], $status);
  }
}


if(!function_exists('error'))
{
  /**
   * 错误响应
   *
   * @param string $message 错误消息
   * @param int $status 错误状态
   * @return JsonResponse
   */
  function error(string $message, int $status = 1000, int $httpCode = 200) : JsonResponse
  {
    return response()->json([
      'status' => $status,
      'message' => $message,
      'timestamp' => time(),
    ], $httpCode);
  }
}


if(!function_exists('record'))
{
  /**
   * 异常记录与处理
   *
   * @param Throwable $exception 异常对象
   * @param string $level 日志级别
   * @return void
   */
  function record(Throwable $exception, string $level = 'error') : void
  {
    $env = config('app.env');

    // 本地和测试环境直接展示异常详情
    if(in_array($env, ['local', 'testing'], true))
    {
      dd($exception);
    }

    // 构建异常信息
    $message = sprintf(
      "Exception: %s\nFile: %s:%d\nTrace: %s",
      $exception->getMessage(),
      $exception->getFile(),
      $exception->getLine(),
      $exception->getTraceAsString()
    );

    // 按环境和级别记录日志
    Log::log($level, $message);
  }
}


if(!function_exists('debug'))
{
  /**
   * 调试数据打印
   *
   * @param mixed $data 要打印的数据
   * @return void
   */
  function debug(mixed $data) : void
  {
    // 生产环境禁用调试打印
    if(config('app.env') === 'production')
    {
      return;
    }

    dd($data);
  }
}
